package com.syq.example.thread;


import java.util.Random;

//说有有个售票系统，开方法了atm 自动售卖和  窗口人工售卖 但是核心是 售票功能是买票系统的，atm和人工只能申请调用
public class TicketSystem implements Sell{
   int ticketnum = 100;
   public

   void sell(String name){//synchronized  同步 加在方法就叫同步方法

      if(name.equals("ATM")){
          atmSell();
      }else{
          sellerSell();
      }

   }


   void atmSell(){//2分之概率 没有票纸
       if(Math.abs(new Random().nextInt()) % 10== 1){
           System.out.println("检查红票纸张不够，卖票取消");
           return;
       }
     synchronized (this) {
         System.out.println("第" + ticketnum + "张票被atm销售");
         ticketnum--;
     }
   }
   void sellerSell(){
       if(Math.abs(new Random().nextInt()) % 100== 1){
           System.out.println("检查蓝票纸张不够，卖票取消");
           return;
       }
       synchronized (this) {
           System.out.println("第" + ticketnum + "张票被seller销售");
           ticketnum--;
       }
   }

   public int getTicketnum(){
       return this.ticketnum;
   }
   public void init(){
       System.out.println("系统初始化");
   }

    public static void main(String[] args) {
        TicketSystem ticketSystem = new TicketSystem();
        ATM atm = new ATM(ticketSystem);
        Seller seller = new Seller(ticketSystem);
      atm.start();
      seller.start();
         //多个对象不停卖票 会出现重复卖导致 线程安全
    }
}

interface Sell{
    public void sell(String name);
    public int getTicketnum();
}
//静态代理
class ATM extends Thread implements Sell{
    Sell sell;
    public ATM(Sell sell){//AYM机的初始化 需要 Sell接口的实现类准备好 也就是买票系统准备好？谁给它准备卖票票系统 那就是卖票系统自己
        this.sell = sell;
    }
    public void sell(String name){//atm只能调用卖票接口的卖票方法来卖票
        sell.sell(name);
    }
    public int getTicketnum(){
        return 0;
    }
    public void run(){
        while(true) {
            this.sell(ATM.class.getSimpleName());
            if(sell.getTicketnum()<=0){//如果系统的票为0就退出
                break;
                }
            try {
                this.sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
class Seller extends Thread implements Sell{
    Sell sell;
    public Seller(Sell sell){//AYM机的初始化 需要 Sell接口的实现类准备好 也就是买票系统准备好？谁给它准备卖票票系统 那就是卖票系统自己
        this.sell = sell;
    }
    public void sell(String name){
        sell.sell(name);//seller只能调用卖票接口的卖票方法来卖票
    }
    public int getTicketnum(){
        return 0;
    }

    public void run(){
        while(true) {
            this.sell(Seller.class.getSimpleName());
            if(sell.getTicketnum()<=0){//如果系统的票为0就退出
                break;
            }
            try {
                this.sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
